package com.rabbiter.oes.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rabbiter.oes.entity.ApiResult;
import com.rabbiter.oes.entity.Score;
import com.rabbiter.oes.serviceimpl.ScoreServiceImpl;
import com.rabbiter.oes.util.ApiResultHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 成绩管理控制器，处理成绩相关的HTTP请求
 */
@RestController
public class ScoreController {
    @Autowired
    private ScoreServiceImpl scoreService;

    /**
     * 获取所有学生成绩数据
     * @return ApiResult 包含状态码、消息和所有成绩数据的响应对象
     */
    @GetMapping("/scores")
    public ApiResult findAll() {
        List<Score> res = scoreService.findAll();
        return ApiResultHandler.buildApiResult(200,"查询所有学生成绩",res);
    }

    /**
     * 分页查询指定学生的成绩
     * @param page 当前页码
     * @param size 每页数据量
     * @param studentId 需要查询的学生ID
     * @return ApiResult 包含状态码、消息和分页成绩数据的响应对象
     */
    @GetMapping("/score/{page}/{size}/{studentId}")
    public ApiResult findById(@PathVariable("page") Integer page, @PathVariable("size") Integer size, @PathVariable("studentId") Integer studentId) {
        Page<Score> scorePage = new Page<>(page, size);
        IPage<Score> res = scoreService.findById(scorePage, studentId);
        return ApiResultHandler.buildApiResult(200, "根据ID查询成绩", res);
    }

    /**
     * 查询指定学生的所有成绩（非分页方式）
     * @param studentId 需要查询的学生ID
     * @return ApiResult 包含状态码、消息和成绩列表的响应对象
     *         当存在数据时返回200状态码，不存在时返回400状态码
     */
    @GetMapping("/score/{studentId}")
        public ApiResult findById(@PathVariable("studentId") Integer studentId) {
        List<Score> res = scoreService.findById(studentId);
        if (!res.isEmpty()) {
            return ApiResultHandler.buildApiResult(200, "根据ID查询成绩", res);
        } else {
            return ApiResultHandler.buildApiResult(400, "ID不存在", res);
        }
    }

    /**
     * 添加新的成绩记录
     * @param score 通过请求体传递的成绩对象
     * @return ApiResult 包含状态码、消息和操作结果的响应对象
     *         成功返回200状态码，失败返回400状态码
     */
    @PostMapping("/score")
    public ApiResult add(@RequestBody Score score) {
        int res = scoreService.add(score);
        if (res == 0) {
            return ApiResultHandler.buildApiResult(400,"成绩添加失败",res);
        }else {
            return ApiResultHandler.buildApiResult(200,"成绩添加成功",res);
        }
    }

    /**
     * 根据考试编号查询成绩
     * @param examCode 需要查询的考试编号
     * @return ApiResult 包含状态码、消息和对应考试的成绩列表
     */
    @GetMapping("/scores/{examCode}")
    public ApiResult findByExamCode(@PathVariable("examCode") Integer examCode) {
        List<Score> scores = scoreService.findByExamCode(examCode);
        return ApiResultHandler.buildApiResult(200,"查询成功",scores);
    }
}
